package com.bl.commons.utils;

import com.alibaba.excel.EasyExcel;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

/**
 * Easyexcel工具
 *
 * @author bl
 * @date 2023/11/24
 */
public class EasyexcelUtils {


    /**
     * hutool的poi导出和EasyExcel区别:
     * POI由于在操作excel时是先将所有数据都读入内存后，再写入文件，比较消耗内存，特别是大数据量时，容易出现OOM
     * EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中，而是从磁盘上一行行读取数据，逐个解析。
     * 1.少量数据导出,poi比easyExcel稍快,数据量大到一定程度(跟上边的内存使用相关),easyExcel比poi导出更快了
     * 2.poi有最大导出数量限制:仅当前测试: poi可导出最大行数是[poi导出65536条数据总耗时===1846],easyExcel暂时10w的量级依然支持
     *
     *  动态表头数据导出
     * @param response 响应
     * @param headers 表头
     * @param dataList 数据
     * @param excelType excel类型
     * @param fileName 文件名
     */
    public static void dynamicExport(HttpServletResponse response,
                              List<List<String>> headers,
                              List<List<Object>> dataList,
                              String excelType,
                              String fileName) throws IOException {
        //设置响应
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + excelType);
        EasyExcel.write(response.getOutputStream())
                .head(headers)
                .sheet(0,fileName)
                .doWrite(dataList);
    }
}
